package hos.location;

import java.util.List;
import java.util.Map;

/**
 * <p>Title: StringBuilderJsonUtils </p>
 * <p>Description: 提供便捷方法将键值对格式化为 JSON 字串并追加至 StringBuilder</p>
 * <p>Company: www.mapuni.com </p>
 *
 * @author : 蔡俊峰
 * @date : 2025-05-14 14:00
 * @version : 1.0
 */
public final class JsonUtils {

//    /**
//     * 追加字符串类型的 JSON 字段
//     *
//     * @param sb    目标字符串构建器
//     * @param key   JSON 键名
//     * @param value 值，若为 null 则调用 appendNullField
//     */
//    public static void appendStringField(StringBuilder sb, String key, String value) {
//        if (value != null) {
//            sb.append('"').append(key).append("\":\"");
//            jsonEscape(sb, value);
//            sb.append('"');
//        } else {
//            appendNullField(sb, key);
//        }
//    }
//
//    /**
//     * 追加 null 类型的 JSON 字段
//     *
//     * @param sb  目标字符串构建器
//     * @param key 键名
//     */
//    public static void appendNullField(StringBuilder sb, String key) {
//        sb.append('"').append(key).append("\":null");
//    }
//
//    /**
//     * 泛型方法：追加任意对象类型的 JSON 字段
//     *
//     * @param sb    目标字符串构建器
//     * @param key   键名
//     * @param value 值，可为 null
//     */
//    public static <T> void appendObjectField(StringBuilder sb, String key, T value) {
//        if (value != null) {
//            if (value instanceof String) {
//                appendStringField(sb, key, (String) value);
//            } else {
//                sb.append('"').append(key).append("\":").append(value);
//            }
//        } else {
//            appendNullField(sb, key);
//        }
//    }
//
//    /**
//     * 对字符串进行 JSON 转义处理，例如转义双引号和控制字符
//     *
//     * @param sb    目标字符串构建器
//     * @param value 待转义字符串
//     */
//    private static void jsonEscape(StringBuilder sb, String value) {
//        for (int i = 0, len = value.length(); i < len; i++) {
//            char c = value.charAt(i);
//            switch (c) {
//                case '"':
//                    sb.append("\\\"");
//                    break;
//                case '\\':
//                    sb.append("\\\\");
//                    break;
//                case '\b':
//                    sb.append("\\b");
//                    break;
//                case '\f':
//                    sb.append("\\f");
//                    break;
//                case '\n':
//                    sb.append("\\n");
//                    break;
//                case '\r':
//                    sb.append("\\r");
//                    break;
//                case '\t':
//                    sb.append("\\t");
//                    break;
//                default:
//                    sb.append(c);
//            }
//        }
//    }
//
//    /**
//     * 构建一个 JSON 对象字符串（用于测试或快速构造）
//     *
//     * @param map 包含键值对的 Map
//     * @return JSON 字符串
//     */
//    public static String buildJsonFromMap(Map<String, Object> map) {
//        StringBuilder sb = new StringBuilder("{");
//        boolean first = true;
//        for (Map.Entry<String, Object> entry : map.entrySet()) {
//            if (!first) {
//                sb.append(",");
//            }
//            sb.append('"').append(entry.getKey()).append("\":");
//            Object value = entry.getValue();
//            if (value == null) {
//                sb.append("null");
//            } else if (value instanceof String) {
//                sb.append("\"");
//                jsonEscape(sb, (String) value);
//                sb.append("\"");
//            } else {
//                sb.append(value);
//            }
//            first = false;
//        }
//        sb.append("}");
//        return sb.toString();
//    }


    /**
     * @noinspection unchecked
     */
    public static String toJson(List<?> list) {
        if (list == null || list.isEmpty()) {
            return "[]";
        }
        StringBuilder sb = new StringBuilder("[");
        for (Object item : list) {
            if (item instanceof List) {
                sb.append(toJson((List<?>) item)).append(",");
            } else if (item instanceof Map) {
                sb.append(toJson((Map<String, ?>) item)).append(",");
            } else {
                sb.append("\"").append(item).append("\",");
            }
        }
        if (sb.charAt(sb.length() - 1) == ',') {
            sb.deleteCharAt(sb.length() - 1);
        }
        sb.append("]");
        return sb.toString();
    }


    /**
     * @noinspection unchecked
     */
    public static String toJson(Map<String, ?> mapList) {
        if (mapList == null || mapList.isEmpty()) {
            return "{}";
        }
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        for (Map.Entry<String, ?> entry : mapList.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();

            sb.append("\"").append(key).append("\":");

            if (value == null) {
                sb.append("null,");
            } else if (value instanceof String) {
                sb.append("\"").append(value).append("\",");
            } else if (value instanceof List) {
                sb.append(toJson((List<?>) value)).append(",");
            } else if (value instanceof Map) {
                sb.append(toJson((Map<String, ?>) value)).append(",");
            } else {
                sb.append("\"").append(value).append("\",");
            }
        }
        if (sb.charAt(sb.length() - 1) == ',') {
            sb.deleteCharAt(sb.length() - 1);
        }
        sb.append("}");
        return sb.toString();
    }
}
